package Ui;

import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Date;
import java.util.Random;

public class GameJfram extends JFrame implements KeyListener, ActionListener {
    //下面好几个方法需要用到二维数组，所以定义在成员变量
    int[][] data = new int[4][4];

    //创建条目对象
    JMenuItem replayItem = new JMenuItem("重新游戏");
    JMenuItem loginItem = new JMenuItem("重新登录");
    JMenuItem closeItem = new JMenuItem("关闭游戏");


    //创建JMenuItem存储美女，动物，运动的选项，并添加到更换图片中
    JMenuItem beautyItem = new JMenuItem("美女");
    JMenuItem animalItem = new JMenuItem("动物");
    JMenuItem sportItem = new JMenuItem("运动");

    JMenuItem accountuItem = new JMenuItem("公众号");


    //记录空白方块在二维数组中的位置
    int x = 0;
    int y = 0;

    //计数器计步数
    int count = 0;


    //定义一个变量记录图片路径，方便后面调用改写
    String path = "..\\jigsawGame\\image\\girl\\";

    //定义一个二维数组，存储正确的数据
    int[][] win = {
            {1, 2, 3, 4},
            {5, 6, 7, 8},
            {9, 10, 11, 12},
            {13, 14, 15, 0},
    };

    public GameJfram() {
        //初始化界面
        initJframe();
        //初始化菜单
        initJMenuBar();
        //初始化数据（打乱图片）
        initData();
        //初始化图片
        initImage();
        //框架默认隐藏，需要调用setVisible方法显示,false关闭，true显示，写在最后
        this.setVisible(true);
    }

    private void initData() {
        int[] arr = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
        Random r = new Random();
        //打乱顺序
        for (int i = 0; i < arr.length; i++) {
            int index = r.nextInt(arr.length);
            int tmp = arr[i];
            arr[i] = arr[index];
            arr[index] = tmp;
        }
        //将打乱顺序后的数据添加到二维数组
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == 0) {
                x = i / 4;
                y = i % 4;
                //打印坐标
//                System.out.println(x);
//                System.out.println(y);
            }{
                   data[i / 4][i % 4] = arr[i];
            }
        }
        }

        private void initImage () {
            //键盘每监听到操作一次，图片就要重新加载
            this.getContentPane().removeAll();
            if (victory()) {
                //显示胜利的图片
                JLabel jLabel = new JLabel(new ImageIcon("C:\\Users\\zkd\\IdeaProjects\\jigsawGame\\image\\background\\win.jpg"));
                jLabel.setBounds(157, 165, 276, 186);
                this.getContentPane().add(jLabel);
            }

            JLabel countjlabel = new JLabel("步数" + count);
            countjlabel.setBounds(20, 10, 50, 30);
            this.getContentPane().add(countjlabel);


            for (int i = 0; i < 4; i++) {
                for (int j = 0; j < 4; j++) {
                    //定义一个变量接收二维数组坐标
                    int num = data[i][j];
                    //创建一个图片ImageIcon对象,创建一个JLabel对象（管理容器）
                    JLabel jLabel = new JLabel(new ImageIcon(path + num + ".jpg"));
                    //指定图片位置
                    jLabel.setBounds(130 * j + 35, 129 * i + 35, 130, 129);
                    //给图片添加边框（border）
                    jLabel.setBorder(new BevelBorder(BevelBorder.LOWERED));
                    this.getContentPane().add(jLabel);
                }
            }
            //添加背景图片
            ImageIcon bg = new ImageIcon("..\\jigsawGame\\image\\background\\25dba0acfe6c5c0cc22f056fc72e16bf.jpg");
            JLabel background = new JLabel(bg);
            //设置位置和宽高
            background.setBounds(0, 0, 600, 750);
            this.getContentPane().add(background);

            //刷新页面，写在后面
            this.getContentPane().repaint();
        }


        private void initJMenuBar () {
            //初始化菜单
            //创建整个的菜单对象
            JMenuBar jmenuBar = new JMenuBar();

            //创建选项的对象
            JMenu fanctionMenu1 = new JMenu("功能");
            JMenu aboutMenu2 = new JMenu("关于我");
            JMenu replaceItem = new JMenu("更换图片");

            //添加到更换图片
            replaceItem.add(beautyItem);
            replaceItem.add(animalItem);
            replaceItem.add(sportItem);

            //绑定监听事件
            replayItem.addActionListener(this);
            loginItem.addActionListener(this);
            closeItem.addActionListener(this);
            replaceItem.addActionListener(this);
            accountuItem.addActionListener(this);
            beautyItem.addActionListener(this);
            animalItem.addActionListener(this);
            sportItem.addActionListener(this);

            //将条目对象添加到创建的选项中
            fanctionMenu1.add(replayItem);
            fanctionMenu1.add(loginItem);
            fanctionMenu1.add(closeItem);
            fanctionMenu1.add(replaceItem);

            aboutMenu2.add(accountuItem);



            //将选项添加到菜单（JMenuBar）中
            jmenuBar.add(fanctionMenu1);
            jmenuBar.add(aboutMenu2);

            //给界面设置菜单
            this.setJMenuBar(jmenuBar);

        }

        private void initJframe () {
            //设置界面的宽高
            this.setSize(600, 650);
            //设置界面的标题
            this.setTitle("拼图单机版 v1.0");
            //设置界面置顶
            this.setAlwaysOnTop(true);
            //设置打开默认正中间
            this.setLocationRelativeTo(null);//relative（相对）
            //设置游戏的关闭模式，叉掉游戏界面，代码停止运行
            this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

            //取消默认的居中放置
            this.setLayout(null);
            //给整个界面添加监听事件
            this.addKeyListener(this);
        }

        @Override
        public void keyTyped (KeyEvent e){

        }

        //按下不松时调用
        @Override
        public void keyPressed (KeyEvent e){
            int keycode = e.getKeyCode();
            if (keycode == 17) {
                //将页面上的图片全部删除
                this.getContentPane().removeAll();
                //加载完整图片
                JLabel all = new JLabel(new ImageIcon(path + "\\all.jpg"));
                //设置图片位置
                all.setBounds(10, 10, 565, 543);
                //将图片加载到容器中
                this.getContentPane().add(all);
                //加载背景图片
                //添加背景图片
                ImageIcon bg = new ImageIcon("..\\jigsawGame\\image\\background\\25dba0acfe6c5c0cc22f056fc72e16bf.jpg");
                JLabel background = new JLabel(bg);
                //设置位置和宽高
                background.setBounds(0, 0, 600, 750);
                this.getContentPane().add(background);
                //刷新页面
                this.getContentPane().repaint();
            }
        }

        @Override
        public void keyReleased (KeyEvent e){

            //判断游戏是否已经结束,如果游戏胜利，则不能再键盘监听
            if (victory()) {
                return;
            }
            int code = e.getKeyCode();
            //向左移动
            if (code == 37) {
                System.out.println("向左移动");
                if (y == 3) {
                    return;
                }
                data[x][y] = data[x][y + 1];
                data[x][y + 1] = 0;
                //此时空白方块的位置已经改变
                y++;
                //每移动一次，计数器加一
                count++;
                //调用方法，用最新的数据去加载图片
                initImage();
            }//向上移动
            else if (code == 38) {
                System.out.println("向上移动");
                if (x == 3) {
                    return;
                }
                data[x][y] = data[x + 1][y];
                data[x + 1][y] = 0;
                x++;
                count++;
                initImage();
            }//向右移动
            else if (code == 39) {
                System.out.println("向右移动");
                if (y == 0) {
                    return;
                }
                data[x][y] = data[x][y - 1];
                data[x][y - 1] = 0;
                y--;
                count++;
                initImage();
            }//向下移动
            else if (code == 40) {
                System.out.println("向下移动");
                if (x == 0) {
                    return;
                }
                data[x][y] = data[x - 1][y];
                data[x - 1][y] = 0;
                x--;
                count++;
                initImage();
            } else if (code == 17) {
                initImage();
            }//当按下alt键，一键通关
            else if (code == 18) {
                //重新创建规律的二维数组
                data = new int[][]{
                        {1, 2, 3, 4},
                        {5, 6, 7, 8},
                        {9, 10, 11, 12},
                        {13, 14, 15, 0}
                };
                initImage();
            }

        }

        //判断是否完成拼图，返回布尔类型
        public boolean victory () {
            for (int i = 0; i < data.length; i++) {
                for (int j = 0; j < data[i].length; j++) {
                    if (data[i][j] != win[i][j]) {
                        return false;
                    }
                }
            }
            return true;
        }

        @Override
        public void actionPerformed (ActionEvent e){
            //获取当前被点击的条目对象
            Object obj = e.getSource();
            if (obj == replayItem) {
                System.out.println("重新开始");
                count = 0;
                initData();
                initImage();

            } else if (obj == loginItem) {
                System.out.println("重新登陆");
                //返回登录界面
                //关闭当前的游戏界面
                this.setVisible(false);
                //打开登录界面
                new LoginJfram();
            } else if (obj == closeItem) {
                System.out.println("关闭游戏");
                //关闭虚拟机(0)
                System.exit(WindowConstants.DO_NOTHING_ON_CLOSE);
            } else if (obj == accountuItem) {
                System.out.println("公众号");
                //点击关于我跳出来二维码显示在屏幕中间
                //创建一个Jdialog对象
                JDialog jDialog = new JDialog();
                JLabel jLabel = new JLabel(new ImageIcon("..\\jigsawGame\\image\\about\\about.png"));
                //设置jlabel宽高和位置
                jLabel.setBounds(0,0,300,285);
                //将jlabel添加到弹窗
                jDialog.add(jLabel);
                //设置弹窗大小
                jDialog.setSize(300,280);
                //设置弹窗居中
                jDialog.setLocationRelativeTo(null);
                //设置弹窗置顶
                jDialog.setAlwaysOnTop(true);
                //设置不关闭弹窗无法进行下面操作
                jDialog.setModal(true);
                //让弹窗显示
                jDialog.setVisible(true);
            }
        }
    }




